package com.qf.listener;

import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

/**
 * 消费者监听器
 * @author 千锋健哥
 */
//@Component
//@RabbitListener(queues = "queue1")
public class Queue1Listener {

    /**
     * 从队列中获取数据并处理
     * @param msg
     */
//    @RabbitHandler
    public void messageHandler(String msg, Channel channel, Message message) throws Exception {
        try {
            System.out.println("====queue1=====" + msg);

            //手动ack, 返回true, 处理成功
            /**
             * 第一个参数: DeliveryTag,消息的唯一标识  channel+消息编号
             * 第二个参数：是否开启批量处理 false:不开启批量
             * 举个栗子： 假设我先发送三条消息deliveryTag分别是5、6、7，可它们都没有被确认，
             *           我发第四条消息此时deliveryTag为8，multiple设置为 true，
             *           会将5、6、7、8的消息全部进行确认。
             */
            channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
        } catch (Exception e) {
            e.printStackTrace();
            //告诉mq服务器, 接收数据不成功, 让mq从新发送消息
            /**
             * 返回失败通知
             * 第一个参数: DeliveryTag,消息的唯一标识  channel+消息编号
             * 第二个boolean true所有消费者都会拒绝这个消息，false代表只有当前消费者拒绝
             * 第三个boolean true消息接收失败重新回到原有队列中
             */
            channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, true);
        }

    }
}
